React์ ๋์์ฑ ๊ธฐ๋ฅ์ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ๋ํ ์ฌ์ธต ๋ถ์๊ณผ ํจ๊ป ์ดํด๋ณด์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
React ๋์์ฑ ๊ธฐ๋ฅ: ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง ๋ง์คํฐํ๊ธฐ
React ๋์์ฑ ๊ธฐ๋ฅ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ฐ์ดํธ์ ๋ ๋๋ง์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์์ด ์ค๋ํ ๋ฐ์ ์ ์๋ฏธํฉ๋๋ค. ์ด ์ค ๊ฐ์ฅ ์ํฅ๋ ฅ ์๋ ์ธก๋ฉด ์ค ํ๋๋ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ผ๋ก, ๊ฐ๋ฐ์๊ฐ ๋ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ฑ๋ฅ์ด ์ข์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๊ธ์์๋ React ํ๋ก์ ํธ์์ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ์ดํดํ๊ณ ๊ตฌํํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
React ๋์์ฑ ๊ธฐ๋ฅ์ด๋ ๋ฌด์์ธ๊ฐ?
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ๋ํด ์์๋ณด๊ธฐ ์ ์, React ๋์์ฑ ๊ธฐ๋ฅ์ ๋ ๋์ ๋งฅ๋ฝ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. React 16๊ณผ ํจ๊ป ๋์ ๋ ์ด ๊ธฐ๋ฅ๋ค์ React๊ฐ ์์ ์ ๋์์ ์ํํ ์ ์๊ฒ ํ์ฌ, ์ฌ๋ฌ ์ ๋ฐ์ดํธ๊ฐ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํนํ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ์ ์ฐํ๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค.
๋์์ฑ ๊ธฐ๋ฅ์ ํต์ฌ ์ธก๋ฉด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ค๋จ ๊ฐ๋ฅํ ๋ ๋๋ง: React๋ ์ฐ์ ์์์ ๋ฐ๋ผ ๋ ๋๋ง ์์ ์ ์ผ์ ์ค์ง, ์ฌ๊ฐ ๋๋ ํฌ๊ธฐํ ์ ์์ต๋๋ค.
- ์๊ฐ ๋ถํ (Time Slicing): ์ค๋ ์คํ๋๋ ์์ ์ ๋ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋๋์ด ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์ ์ ๋ ฅ์ ๊ณ์ ๋ฐ์ํ ์ ์๋๋ก ํฉ๋๋ค.
- Suspense: ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ์ ์ธ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ UI ์ฐจ๋จ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง: ๊ฐ๋ฐ์๊ฐ ๋ค์ํ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ํ ๋นํ์ฌ ๊ฐ์ฅ ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ด ๋จผ์ ๋ ๋๋ง๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง ์ดํดํ๊ธฐ
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ React๊ฐ DOM์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ๋ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ฐ์ ์์๋ฅผ ํ ๋นํจ์ผ๋ก์จ ์ด๋ค ์ ๋ฐ์ดํธ๊ฐ ๋ ์๊ธํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด ๋ค๋ฅธ ์ ๋ฐ์ดํธ๋ณด๋ค ๋จผ์ ๋ ๋๋ง๋์ด์ผ ํ๋์ง๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ์ฌ์ฉ์ ์ ๋ ฅ ํ๋๋ ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ ์ค์ํ UI ์์๊ฐ ๋ ์ค์ํ ๋ค๋ฅธ ์ ๋ฐ์ดํธ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐ์ํ๋๋ผ๋ ๋ฐ์์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
React๋ ๋ด๋ถ์ ์ผ๋ก ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ค์ผ์ค๋ฌ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ๋ฌ ๋ ์ธ(์ฐ์ ์์ ํ๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ)์ผ๋ก ๋ถ๋ฅํฉ๋๋ค. ์ฐ์ ์์๊ฐ ๋์ ๋ ์ธ์ ์ ๋ฐ์ดํธ๊ฐ ๋ฎ์ ์ฐ์ ์์์ ์ ๋ฐ์ดํธ๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ด ์ค์ํ ์ด์
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ์ด์ ์ ๋ง์ต๋๋ค:
- ํฅ์๋ ๋ฐ์์ฑ: ์ค์ํ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ๋์์ผ๋ก์จ ๋ฌด๊ฑฐ์ด ์ฒ๋ฆฌ ์ค์ UI๊ฐ ์๋ตํ์ง ์๊ฒ ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ค์๋ ์ ๋ ฅ ํ๋์ ์ ๋ ฅํ๋ ๊ฒ์ ํญ์ ๋ฐ์์ฑ์ด ์์ด์ผ ํฉ๋๋ค.
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋ฐ์์ฑ์ด ์ข๊ณ ์ ์ฐํ UI๋ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค. ์ฌ์ฉ์๋ ์ง์ฐ์ด๋ ๋๋ ์ด๋ฅผ ๋ ๊ฒฝํํ๊ฒ ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ์ฑ๋ฅ ์ข๊ฒ ๋๊ปด์ง๋๋ค.
- ์ต์ ํ๋ ์ฑ๋ฅ: ์ ๋ต์ ์ผ๋ก ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ์ง์ ํจ์ผ๋ก์จ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ์ต์ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ ์์ ์ ์ฐ์ํ ์ฒ๋ฆฌ: ๋์์ฑ ๊ธฐ๋ฅ, ํนํ Suspense์ ๊ฒฐํฉ๋ ๋, UI๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๊ธฐํ ๋น๋๊ธฐ ์์ ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
React์์ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ด ์๋ํ๋ ๋ฐฉ์
React์ ์ค์ผ์ค๋ฌ๋ ์ฐ์ ์์ ์์ค์ ๋ฐ๋ผ ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. React๊ฐ ๋ชจ๋ ๊ฐ๋ณ ์ ๋ฐ์ดํธ์ ๋ํด ๋ช ์์ ์ผ๋ก ์ฐ์ ์์ ์์ค์ ์ค์ ํ๋ ์ง์ ์ ์ธ API๋ฅผ ์ ๊ณตํ์ง๋ ์์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐํํ๊ณ ํน์ API๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด React๊ฐ ๋ค๋ฅธ ์ ๋ฐ์ดํธ์ ํ ๋นํ๋ ์ฐ์ ์์์ ์์์ ์ผ๋ก ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๋ ๊ฒ์ด ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ํต์ฌ์ ๋๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํ ์์์ ์ฐ์ ์์ ์ง์
ํด๋ฆญ, ํค ์ ๋ ฅ ๋๋ ํผ ์ ์ถ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋ ์ ๋ฐ์ดํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋น๋๊ธฐ ์์ ์ด๋ ํ์ด๋จธ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋ ์ ๋ฐ์ดํธ๋ณด๋ค ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ต๋๋ค. ์ด๋ React๊ฐ ์ฌ์ฉ์ ์ํธ์์ฉ์ด ๋ ์๊ฐ์ ๋ฏผ๊ฐํ๊ณ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ :
```javascript function MyComponent() { const [text, setText] = React.useState(''); const handleChange = (event) => { setText(event.target.value); }; return ( ); } ```์ด ์์ ์์ `text` ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ `handleChange` ํจ์๋ ์ฌ์ฉ์์ ์ ๋ ฅ์ ์ํด ์ง์ ํธ๋ฆฌ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. React๋ ์ ๋ ฅ ํ๋์ ๋ฐ์์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ด ์ ๋ฐ์ดํธ์ ๋ ๋๋ง์ ์ฐ์ ์ํ ๊ฒ์ ๋๋ค.
`useTransition`์ ์ฌ์ฉํ ๋ฎ์ ์ฐ์ ์์ ์ ๋ฐ์ดํธ
useTransition ํ
์ ํน์ ์
๋ฐ์ดํธ๋ฅผ ๋ ์๊ธํ ๊ฒ์ผ๋ก ๋ช
์์ ์ผ๋ก ํ์ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ์ด๋ฅผ ํตํด UI๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ํ ์ํ์์ ๋ค๋ฅธ ์ํ๋ก ์ ํํ ์ ์์ต๋๋ค. ์ด๋ ํฐ ์ฌ๋ ๋๋ง์ ์ ๋ฐํ๊ฑฐ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ฆ์ ์ค์ํ์ง ์์ ๋ณต์กํ ๊ณ์ฐ์ ํธ๋ฆฌ๊ฑฐํ๋ ์
๋ฐ์ดํธ์ ํนํ ์ ์ฉํฉ๋๋ค.
useTransition์ ๋ ๊ฐ์ง ๊ฐ์ ๋ฐํํฉ๋๋ค:
isPending: ์ ํ์ด ํ์ฌ ์งํ ์ค์ธ์ง๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋๋ค.startTransition: ์ง์ฐ์ํค๊ณ ์ถ์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ์ธ๋ ํจ์์ ๋๋ค.
์์ :
```javascript import React, { useState, useTransition } from 'react'; function MyComponent() { const [isPending, startTransition] = useTransition(); const [filter, setFilter] = useState(''); const [data, setData] = useState([]); const handleFilterChange = (event) => { const newFilter = event.target.value; // ๋ฐ์ดํฐ ํํฐ๋ง์ ํธ๋ฆฌ๊ฑฐํ๋ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํต๋๋ค startTransition(() => { setFilter(newFilter); }); }; // 'filter' ์ํ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ํํฐ๋ง ์๋ฎฌ๋ ์ด์ React.useEffect(() => { // API ํธ์ถ ์๋ฎฌ๋ ์ด์ setTimeout(() => { const filteredData = Array.from({ length: 1000 }, (_, i) => `Item ${i}`).filter(item => item.includes(filter)); setData(filteredData); }, 500); }, [filter]); return (Filtering...
}-
{data.map((item, index) => (
- {item} ))}
์ด ์์ ์์ `handleFilterChange` ํจ์๋ `setFilter` ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํค๊ธฐ ์ํด `startTransition`์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ React๊ฐ ์ด ์
๋ฐ์ดํธ๋ฅผ ๋ ์๊ธํ ๊ฒ์ผ๋ก ์ทจ๊ธํ๊ณ , ๋ ๋์ ์ฐ์ ์์์ ์
๋ฐ์ดํธ(์: ๋ค๋ฅธ ์ฌ์ฉ์ ์ํธ์์ฉ)๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ ์ค๋จํ ์ ์์์ ์๋ฏธํฉ๋๋ค. isPending ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ์ด ์งํ๋๋ ๋์ ๋ก๋ฉ ํ์๊ธฐ๋ฅผ ํ์ํ์ฌ ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
useTransition์ด ์๋ค๋ฉด, ํํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฆ์ ์ ์ฒด ๋ชฉ๋ก์ ์ฌ๋ ๋๋ง์ด ํธ๋ฆฌ๊ฑฐ๋์ด ํนํ ํฐ ๋ฐ์ดํฐ์
์ ๊ฒฝ์ฐ UI๊ฐ ์๋ตํ์ง ์๊ฒ ๋ ์ ์์ต๋๋ค. useTransition์ ์ฌ์ฉํจ์ผ๋ก์จ, ํํฐ๋ง์ ๋ ๋ฎ์ ์ฐ์ ์์ ์์
์ผ๋ก ์ํ๋์ด ์
๋ ฅ ํ๋๊ฐ ๋ฐ์์ฑ์ ์ ์งํ ์ ์๊ฒ ํฉ๋๋ค.
์ผ๊ด ์ ๋ฐ์ดํธ(Batched Updates) ์ดํดํ๊ธฐ
React๋ ๊ฐ๋ฅํ ๋๋ง๋ค ์ฌ๋ฌ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋จ์ผ ์ฌ๋ ๋๋ง์ผ๋ก ์๋ ์ผ๊ด ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ React๊ฐ DOM์ ์ ๋ฐ์ดํธํด์ผ ํ๋ ํ์๋ฅผ ์ค์ด๋ ์ฑ๋ฅ ์ต์ ํ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๊ด ์ฒ๋ฆฌ๊ฐ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง๊ณผ ์ด๋ป๊ฒ ์ํธ ์์ฉํ๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ ๋ฐ์ดํธ๊ฐ ์ผ๊ด ์ฒ๋ฆฌ๋ ๋, ๋ชจ๋ ๋์ผํ ์ฐ์ ์์๋ฅผ ๊ฐ๋ ๊ฒ์ผ๋ก ์ทจ๊ธ๋ฉ๋๋ค. ์ด๋ ์ ๋ฐ์ดํธ ์ค ํ๋๊ฐ ๋์ ์ฐ์ ์์(์: ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋จ)๋ผ๋ฉด, ์ผ๊ด ์ฒ๋ฆฌ๋ ๋ชจ๋ ์ ๋ฐ์ดํธ๊ฐ ๊ทธ ๋์ ์ฐ์ ์์๋ก ๋ ๋๋ง๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
`Suspense`์ ์ญํ
Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋์ ๋ ๋๋ง์ '์ผ์ ์ค๋จ'ํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ ๋์ UI๊ฐ ์ฐจ๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ , ๊ทธ ๋์ ๋์ฒด UI(์: ๋ก๋ฉ ์คํผ๋)๋ฅผ ํ์ํ ์ ์๊ฒ ํฉ๋๋ค.
๋์์ฑ ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ฌ์ฉ๋ ๋, Suspense๋ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง๊ณผ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์ผ์ ์ค๋จ๋ ๋์ React๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ ๋์ ์ฐ์ ์์๋ก ๊ณ์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ฉด, ์ผ์ ์ค๋จ๋์๋ ์ปดํฌ๋ํธ๋ ๋ ๋ฎ์ ์ฐ์ ์์๋ก ๋ ๋๋ง๋์ด ํ๋ก์ธ์ค ์ ๋ฐ์ ๊ฑธ์ณ UI๊ฐ ๋ฐ์์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ : import('./DataComponent'));
function MyComponent() {
return (
์ด ์์ ์์ `DataComponent`๋ `React.lazy`๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ฐ ๋ก๋๋ฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ `Suspense` ์ปดํฌ๋ํธ๋ `fallback` UI๋ฅผ ํ์ํฉ๋๋ค. `DataComponent`๊ฐ ๋ก๋๋๋ ๋์ React๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๊ณ์ ๋ ๋๋งํ ์ ์์ด UI๊ฐ ๋ฐ์์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
๋ค์ํ ์๋๋ฆฌ์ค์์ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ผ๋ก ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌํ๊ธฐ
์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ํํฐ๋งํด์ผ ํ๋ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ด ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ด ์๋ค๋ฉด, ์ ๋ ฅ ํ๋์ ์ ๋ ฅํ๋ ๊ฒ์ด ์ ์ฒด ๋ฐ์ดํฐ์ ์ ์ฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ์ฌ UI๊ฐ ์๋ตํ์ง ์๊ฒ ๋ ์ ์์ต๋๋ค.
useTransition์ ์ฌ์ฉํ๋ฉด ํํฐ๋ง ์์
์ ์ง์ฐ์์ผ ํํฐ๋ง์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ํ๋๋ ๋์ ์
๋ ฅ ํ๋๊ฐ ๋ฐ์์ฑ์ ์ ์งํ ์ ์์ต๋๋ค. ('`useTransition` ์ฌ์ฉํ๊ธฐ' ์น์
์์ ์ ๊ณต๋ ์์ ์ฐธ์กฐ).
2. ์ ๋๋ฉ์ด์ ์ฐ์ ์์ ์ง์ ํ๊ธฐ
์ ๋๋ฉ์ด์ ์ ๋ถ๋๋ฝ๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์ข ์ข ์ค์ํฉ๋๋ค. ์ ๋๋ฉ์ด์ ์ ๋ฐ์ดํธ์ ๋์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํจ์ผ๋ก์จ, ๋ ์ค์ํ ๋ค๋ฅธ ์ ๋ฐ์ดํธ์ ์ํด ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ ๋๋ฉ์ด์ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ์ง์ ์ ์ดํ์ง๋ ์์ง๋ง, ์ฌ์ฉ์ ์ํธ์์ฉ(์: ์ ๋๋ฉ์ด์ ์ ํธ๋ฆฌ๊ฑฐํ๋ ํด๋ฆญ ์ด๋ฒคํธ)์ ์ํด ์ง์ ํธ๋ฆฌ๊ฑฐ๋๋๋ก ํ๋ฉด ์์์ ์ผ๋ก ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
์์ :
```javascript import React, { useState } from 'react'; function AnimatedComponent() { const [isAnimating, setIsAnimating] = useState(false); const handleClick = () => { setIsAnimating(true); setTimeout(() => { setIsAnimating(false); }, 1000); // ์ ๋๋ฉ์ด์ ์ง์ ์๊ฐ }; return (์ด ์์ ์์ `handleClick` ํจ์๋ `isAnimating` ์ํ๋ฅผ ์ค์ ํ์ฌ ์ง์ ์ ๋๋ฉ์ด์ ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ด ์ ๋ฐ์ดํธ๋ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ React๋ ์ด๋ฅผ ์ฐ์ ์ํ์ฌ ์ ๋๋ฉ์ด์ ์ด ๋ถ๋๋ฝ๊ฒ ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
3. ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ Suspense
API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋, ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ ๋์ UI๊ฐ ์ฐจ๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ ๋์ ๋์ฒด UI๋ฅผ ํ์ํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ฉด React๊ฐ ์๋์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
('`Suspense`์ ์ญํ ' ์น์ ์์ ์ ๊ณต๋ ์์ ์ฐธ์กฐ).
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ์ค์ ์ ๋ฐ์ดํธ ์๋ณ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์คํ๊ฒ ๋ถ์ํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ฅ ์ค์ํ ์ ๋ฐ์ดํธ(์: ์ฌ์ฉ์ ์ ๋ ฅ, ์ ๋๋ฉ์ด์ )๋ฅผ ์๋ณํฉ๋๋ค.
- ์ค์ํ์ง ์์ ์
๋ฐ์ดํธ์
useTransition์ฌ์ฉ:useTransitionํ ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ์ฆ์ ์ค์ํ์ง ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํต๋๋ค. - ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์
Suspenseํ์ฉ:Suspense๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ ๋์ UI๊ฐ ์ฐจ๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. - ์ปดํฌ๋ํธ ๋ ๋๋ง ์ต์ ํ: ๋ฉ๋ชจ์ด์ ์ด์
(
React.memo)๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๊ณ ๋ถํ์ํ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ํผํ์ฌ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ์ต์ํํฉ๋๋ค. - ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ์ผ๋ง: React Profiler๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ด ๊ฐ์ฅ ํจ๊ณผ์ ์ผ ์ ์๋ ์์ญ์ ์๋ณํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ง๋ง, ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
useTransition์ ๋จ์ฉ: ๋๋ฌด ๋ง์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํค๋ฉด UI ๋ฐ์์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ์ ๋ง๋ก ์ค์ํ์ง ์์ ์ ๋ฐ์ดํธ์๋งuseTransition์ ์ฌ์ฉํ์ธ์.- ์ฑ๋ฅ ๋ณ๋ชฉ ํ์ ๋ฌด์: ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ๋ง๋ณํต์น์ฝ์ด ์๋๋๋ค. ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ก์ง์ ๊ทผ๋ณธ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
Suspense์ ์๋ชป๋ ์ฌ์ฉ:Suspense๊ฒฝ๊ณ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฐ์น๋์๋์ง ํ์ธํ๊ณ ๋์ฒด UI๊ฐ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋์ง ํ์ธํ์ธ์.- ํ๋กํ์ผ๋ง ์ํ: ํ๋กํ์ผ๋ง์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง ์ ๋ต์ด ํจ๊ณผ์ ์ธ์ง ํ์ธํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง ๋ฌธ์ ๋๋ฒ๊น ํ๊ธฐ
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ค์ผ์ค๋ฌ์ ๋์์ด ๋ณต์กํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋ค์์ ๋๋ฒ๊น ์ ์ํ ๋ช ๊ฐ์ง ํ์ ๋๋ค:
- React Profiler ์ฌ์ฉ: React Profiler๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๊ณ ๋ ๋๋งํ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ ๋ฐ์ดํธ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
isPending์ํ ๋ชจ๋ํฐ๋ง:useTransition์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐisPending์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ์ฌ ์ ๋ฐ์ดํธ๊ฐ ์์๋๋ก ์ง์ฐ๋๊ณ ์๋์ง ํ์ธํ์ธ์.console.log๋ฌธ ์ฌ์ฉ: ์ปดํฌ๋ํธ์console.log๋ฌธ์ ์ถ๊ฐํ์ฌ ์ธ์ ๋ ๋๋ง๋๊ณ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์๋์ง ์ถ์ ํ์ธ์.- ์ ํ๋ฆฌ์ผ์ด์ ๋จ์ํ: ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฒ๊น ํ๋ ๋ฐ ์ด๋ ค์์ด ์๋ค๋ฉด, ๋ถํ์ํ ์ปดํฌ๋ํธ์ ๋ก์ง์ ์ ๊ฑฐํ์ฌ ๋จ์ํํด ๋ณด์ธ์.
๊ฒฐ๋ก
React ๋์์ฑ ๊ธฐ๋ฅ, ํนํ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ๊ณผ ๋ฐ์์ฑ์ ์ต์ ํํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. React ์ค์ผ์ค๋ฌ์ ์๋ ๋ฐฉ์์ ์ดํดํ๊ณ useTransition ๋ฐ Suspense์ ๊ฐ์ API๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํจ์ผ๋ก์จ ๋ ์ ์ฐํ๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์คํ๊ฒ ๋ถ์ํ๊ณ , ์ค์ํ ์
๋ฐ์ดํธ๋ฅผ ์๋ณํ๋ฉฐ, ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ์ฌ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง ์ ๋ต์ด ํจ๊ณผ์ ์ธ์ง ํ์ธํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด๋ฌํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ๊ธฐ์๊ฒ ํ๋ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ์ธ์.
React ์ํ๊ณ๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ต์ ๊ธฐ๋ฅ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ ํ๋์ ์ด๊ณ ์ฑ๋ฅ ์ข์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ๋ง์คํฐํจ์ผ๋ก์จ ๋ณต์กํ UI ๊ตฌ์ถ์ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ค๋น๊ฐ ๋ ๊ฒ์ ๋๋ค.
์ถ๊ฐ ํ์ต ์๋ฃ
- React ๋์์ฑ ๋ชจ๋์ ๋ํ ๊ณต์ ๋ฌธ์: https://react.dev/reference/react
- React Profiler: React Profiler๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์.
- ๊ธฐ์ฌ ๋ฐ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ: Medium, Dev.to ๋ฐ ๊ณต์ React ๋ธ๋ก๊ทธ์ ๊ฐ์ ํ๋ซํผ์์ React ๋์์ฑ ๊ธฐ๋ฅ ๋ฐ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง์ ๋ํ ๊ธฐ์ฌ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๊ฒ์ํ์ธ์.
- ์จ๋ผ์ธ ๊ฐ์ข: React ๋์์ฑ ๊ธฐ๋ฅ์ ์์ธํ ๋ค๋ฃจ๋ ์จ๋ผ์ธ ๊ฐ์ข ์๊ฐ์ ๊ณ ๋ คํด ๋ณด์ธ์.